package com.zzt.pagehelp.util2;

/**
 * @author: zeting
 * @date: 2022/3/7
 * 分页
 */
public abstract class IPageSize {
    /**
     * 默认起始页下标
     */
    public static final int DEFAULT_START_PAGE_INDEX = 1;
    /**
     * 默认分页大小
     */
    public static final int DEFAULT_PAGE_SIZE = 20;

    /**
     * 当前页下标
     */
    protected int currPageIndex;
    /**
     * 记录上一次的页下标
     */
    int lastPageIndex;
    /**
     * 设置查询页起始页
     */
    protected int initIndex = DEFAULT_START_PAGE_INDEX;
    /**
     * 分页大小
     */
    protected int pageSize = DEFAULT_PAGE_SIZE;
    /**
     * 是否正在加载
     */
    boolean isLoading;
    /**
     * 锁
     */
    Object lock = new Object();

    public IPageSize() {
        initPageConfig();
    }

    public IPageSize(int initIndex, int pageSize) {
        initPageConfig();
        this.initIndex = initIndex;
        this.pageSize = pageSize;
    }

    /**
     * 加载分页数据
     *
     * @param pageIndex 页码
     * @param pageSize  一页多少
     */
    public abstract void load(int pageIndex, int pageSize);

    /**
     * 初始化分页参数
     */
    private void initPageConfig() {
        currPageIndex = getStartPageIndex() - 1;
        lastPageIndex = currPageIndex;
        isLoading = false;
    }

    /**
     * 返回起始页下标
     *
     * @return
     */
    protected int getStartPageIndex() {
        return initIndex;
    }

    /**
     * 设置起始查询页
     *
     * @param initIndex
     * @return
     */
    public IPageSize setInitIndex(int initIndex) {
        this.initIndex = initIndex;
        return this;
    }

    /**
     * 设置分页大小
     *
     * @param pageSize
     * @return
     */
    public IPageSize setPageSize(int pageSize) {
        this.pageSize = pageSize;
        return this;
    }

    /**
     * 当前是否是第一页数据
     *
     * @return
     */
    public boolean isFirstPage() {
        return currPageIndex <= getStartPageIndex();
    }

    /**
     * 分页加载数据
     * [可能会抛出异常，请确认数据加载结束后，你已经调用了finishLoad(boolean success)方法]
     *
     * @param isFirstPage true: 第一页  false: 下一页
     */
    public void loadPage(boolean isFirstPage) {
        synchronized (lock) {
            // 如果正在加载数据，则抛出异常
            if (isLoading) {
                return;
            } else {
                isLoading = true;
            }
        }
        // 加载第一页数据
        if (isFirstPage) {
            currPageIndex = getStartPageIndex();
        } else {
            ++currPageIndex;
        }
        load(currPageIndex, pageSize);
    }

    /**
     * 加载结束
     *
     * @param success true：加载成功  false：失败(无数据)
     */
    public void finishLoad(boolean success) {
        synchronized (lock) {
            isLoading = false;
        }
        if (success) {
            lastPageIndex = currPageIndex;
        } else {
            currPageIndex = lastPageIndex;
        }
    }

    /**
     * 当前是否在加载
     *
     * @return
     */
    public boolean isLoading() {
        return isLoading;
    }
}